package com.qr.service.impl;

import com.qr.context.ThreadContext;
import com.qr.dto.TemplateDTO;
import com.qr.entity.Template;
import com.qr.entity.TemplateMove;
import com.qr.mapper.TemplateMapper;
import com.qr.service.TemplateService;
import com.qr.vo.TempListVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;
import java.util.stream.Collectors;

@Service
@Slf4j
@Transactional
public class TemplateServiceImpl implements TemplateService {

    @Autowired
    private TemplateMapper templateMapper;

    /**
     * 添加模板
     * @param templateDTO
     */
    public void addTemplate(TemplateDTO templateDTO) {
        log.info("添加模板：{}", templateDTO.getTemplateId());
        // 区分一下添加和修改
        if(templateDTO.getTemplateId() != 0) {
            // 先根据ID删除之前的模板数据
            templateMapper.deleteTemplateMove(templateDTO.getTemplateId());
            templateMapper.deleteTemplate(templateDTO.getTemplateId());
        }
        Long userId = ThreadContext.getCurrentId();
        Template template = Template.builder()
                .userId(userId)
                .title(templateDTO.getTitle())
                .description(templateDTO.getDescription())
                .createDate(new Date())
                .updateDate(new Date())
                .build();
        // 插入模板数据
        templateMapper.insertTemplate(template);
        int id = template.getId();
        // 插入模板内容数据
        TemplateMove templateMove = new TemplateMove();
        for(TemplateDTO.AreaInfo areaInfo : templateDTO.getAreaInfo()) {
            for(TemplateDTO.MoveInfo moveInfo : areaInfo.getMoveInfo()) {
                templateMove.setTemplateId(id);
                templateMove.setExerciseAreaId(areaInfo.getAreaId());
                templateMove.setExerciseAreaName(areaInfo.getAreaName());
                templateMove.setExerciseMoveId(moveInfo.getId());
                templateMove.setMoveName(moveInfo.getName());
                templateMapper.insertTemplateMove(templateMove);
            }
        }
    }

    /**
     * 获取模板
     * @return
     */
    public List<Template> getTemplate() {
        // 获取用户id
        Long userId = ThreadContext.getCurrentId();
        return templateMapper.getTemplate(userId);
    }

    /**
     * 根据id获取模板
     * @param id
     */
    public List<TempListVO> getTemplateById(Integer id) {
        log.info("查询模板：{}", id);
        List<TemplateMove> list = templateMapper.getTemplateById(id);
        List<TempListVO> listVO = list.stream()
                .map(move -> {
                    log.info("表达式遍历值为：{}", move);
                    TempListVO tempListVO = new TempListVO();
                    tempListVO.setAreaId(move.getExerciseAreaId());
                    tempListVO.setAreaName(move.getExerciseAreaName());
                    TemplateDTO.MoveInfo moveInfo = new TemplateDTO.MoveInfo();
                    moveInfo.setId(move.getExerciseMoveId());
                    moveInfo.setName(move.getMoveName());
                    tempListVO.setMoveInfo(List.of(moveInfo));
                    return tempListVO;
                }).toList();
        log.info("表达式结果为：{}", listVO);
        Map<Integer, List<TempListVO>> groupByAreaId = listVO.stream()
                .collect(Collectors.groupingBy(TempListVO::getAreaId));
        log.info("分组结果为：{}", groupByAreaId);
        List<TempListVO> resultList = groupByAreaId.entrySet().stream()
                .map(entry -> {
                    log.info("第二次表达式遍历值为：{}", entry);
                    TempListVO tempListVO = new TempListVO();
                    tempListVO.setAreaId(entry.getKey());
                    tempListVO.setAreaName(entry.getValue().get(0).getAreaName());
                    tempListVO.setMoveInfo(Arrays.asList(entry.getValue().stream()
                            .flatMap(moveInfo -> moveInfo.getMoveInfo().stream())
                            .toArray(TemplateDTO.MoveInfo[]::new)));
                    return tempListVO;
                }).toList();
        log.info("第二次表达式结果为：{}", resultList);
        return resultList;
    }

    /**
     * 删除模板
     * @param id
     */
    public void deleteTemplate(Integer id) {
        // 删除模板内容数据
        templateMapper.deleteTemplateMove(id);
        // 删除模板数据
        templateMapper.deleteTemplate(id);
    }
}
